iT邦幫忙

2024 iThome 鐵人賽

DAY 19
0
Kubernetes

Kubernetes三十天就上手系列 第 19

Day 19- Ingress 路由和負載平衡

  • 分享至 

  • xImage
  •  

Ingress:管理 Kubernetes Cluster 中的路由和負載平衡

在 Kubernetes Cluster 中,管理應用服務的外部存取是一個重要且常見的需求。Ingress 是一種專門用來處理這類需求的 Kubernetes 資源,能夠靈活地設定基於 HTTP 和 HTTPS 的路由規則,並提供負載平衡、SSL 支援等多樣化功能。本文將深入探討 Ingress 的運作原理、設定步驟,以及如何利用它來提升 Kubernetes Cluster 的流量管理能力。

Ingress 的基本概念

什麼是 Ingress?

Ingress 是一個 Kubernetes API 對象,用於定義外部如何存取 Kubernetes Cluster 內的服務。它允許 Cluster 管理者設定統一的入口點,並根據 URL 路徑或域名來設定流量轉發規則,這讓多個應用服務可以共用同一個 IP 地址而進行靈活管理。

Ingress Controller 的角色

Ingress 本身只是描述流量應該如何路由的規則,但實際處理流量的任務是由 Ingress Controller 來完成。Ingress Controller 是運行在 Kubernetes Cluster 中的應用,它負責監控 Ingress 資源的變化,並根據設定自動調整負載平衡器的行為。常見的 Ingress Controller 包括 NGINX、Traefik 和 HAProxy 等。

Ingress 的工作流程概述

讓我們透過官方提供的一個簡單的圖示來了解 Ingress 的工作流程:

ingress

  1. 客戶端 (Client):外部用戶通過瀏覽器或應用程式發送 HTTP 或 HTTPS 請求。
  2. Ingress 管理的負載平衡器 (Ingress-managed Load Balancer):該負載平衡器由 Ingress Controller 創建並管理,常見於雲平台中,例如 AWS 的 ELB 或 GCP 的 Load Balancer。
  3. Ingress:負載平衡器將流量轉發至 Ingress 資源,根據預先定義的路由規則分配流量至 Kubernetes 服務。
  4. 路由規則 (Routing Rule):定義流量應該如何基於 URL 路徑或域名來分配到不同的服務。
  5. 服務 (Service):作為流量分發的最終目標,將流量轉發到對應的 Pods。
  6. Pods:實際運行應用的實體,是接收流量並處理請求的後端。

透過這些步驟,Ingress 在提供統一入口的同時,實現了靈活且可擴展的流量管理。

Ingress 的核心功能

Ingress 不僅僅是簡單的路由工具,它還具備以下關鍵功能:

  1. 路由規則:基於域名和 URL 路徑來設定路由規則,這樣可以讓不同路徑的請求被轉發到不同的後端服務。例如,你可以將 "/foo" 路徑的流量導向 foo-service,而 "/bar" 路徑的流量導向 bar-service。
  2. TLS/SSL 支援:Ingress 可以處理 HTTPS 加密,通常與 Kubernetes Secrets 配合使用來儲存和管理 SSL 憑證。
  3. 負載平衡:支援流量的負載平衡,能夠將請求分配至多個後端 Pod。可以透過 HTTP Header 或 Cookie 來實現會話持久化。

設定 Ingress 的基本步驟

要在 Kubernetes 中使用 Ingress,主要分為以下幾個步驟:

1. 安裝 Ingress Controller

首先,需要部署 Ingress Controller。這裡以 NGINX Ingress Controller 為例:

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/cloud/deploy.yaml

這段指令將在你的 Kubernetes Cluster中部署 NGINX Ingress Controller,為後續的 Ingress 設定提供基礎。

2. 創建 Ingress 資源

以下是一個基本的 Ingress 設定範例,展示了如何將不同路徑的流量轉發至相應的服務:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
spec:
  rules:
  - host: example.com
    http:
      paths:
      - path: /foo
        pathType: Prefix
        backend:
          service:
            name: foo-service
            port:
              number: 80
      - path: /bar
        pathType: Prefix
        backend:
          service:
            name: bar-service
            port:
              number: 80

在這個範例中,/foo 路徑的請求將被轉發到 foo-service,而 /bar 路徑的請求則會被轉發到 bar-service

3. 設定 TLS/SSL 支援

如果你需要處理 HTTPS 加密,則可以在 Ingress 中設定 TLS/SSL。以下是具體範例:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: tls-example-ingress
spec:
  tls:
  - hosts:
    - example.com
    secretName: tls-secret
  rules:
  - host: example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: foo-service
            port:
              number: 80

這裡的 tls-secret 包含了 SSL 憑證,Ingress Controller 將使用該憑證來支援 HTTPS 連接。

Ingress 管理指令

  • 查看 Ingress 資源:kubectl get ingress
  • 檢查 Ingress 設置:kubectl describe ingress <ingress-name>
  • 刪除 Ingress 資源:kubectl delete ingress <ingress-name>

DefaultBackend

在 Kubernetes Ingress 中,DefaultBackend 是一個重要但常被忽略的概念,它主要用來處理未匹配到任何路由規則的流量。當請求不符合 Ingress 中設定的規則時,這些請求將會被導向到 DefaultBackend,以避免產生 404 錯誤。

DefaultBackend 的作用

DefaultBackend 是一個後備機制,用來處理所有沒有被明確定義的路徑或主機名。這對於在正式環境中保證系統的強健性(Robustness)至關重要,尤其當你希望所有未匹配的請求都能得到適當處理,而不是直接返回錯誤訊息。

設定 DefaultBackend

可以在 Ingress 資源中指定 defaultBackend,如下範例所示:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
spec:
  defaultBackend:
    service:
      name: default-backend-service
      port:
        number: 80
  rules:
  - host: example.com
    http:
      paths:
      - path: /foo
        pathType: Prefix
        backend:
          service:
            name: foo-service
            port:
              number: 80
      - path: /bar
        pathType: Prefix
        backend:
          service:
            name: bar-service
            port:
              number: 80

在這個範例中,當請求不匹配 /foo/bar 路徑時,流量將被導向 default-backend-service

DefaultBackend 的常見應用場景

  1. 顯示自訂的 404 頁面:透過設定一個專門的服務來顯示 404 錯誤頁面,提供更友好的用戶體驗。
  2. 維護模式頁面:在系統維護時,未匹配到的流量可以統一導向維護模式頁面。
  3. 監控和記錄:你可以將未匹配的流量導向特定服務來進行額外的記錄和監控分析,這樣可以更容易發現潛在的設定問題或外部攻擊。

常見的 DefaultBackend 實現

通常,DefaultBackend 是一個簡單的 Kubernetes Service 和對應的 Deployment,它只需處理基礎的 HTTP 請求,如返回自訂的訊息或頁面。以下是一個常見的 DefaultBackend 設定:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: default-backend
spec:
  replicas: 1
  selector:
    matchLabels:
      app: default-backend
  template:
    metadata:
      labels:
        app: default-backend
    spec:
      containers:
      - name: default-backend
        image: gcr.io/google_containers/defaultbackend:1.5
        ports:
        - containerPort: 8080

---
apiVersion: v1
kind: Service
metadata:
  name: default-backend-service
spec:
  ports:
  - port: 80
    targetPort: 8080
  selector:
    app: default-backend

這個設定使用了一個輕量級的容器來提供基本的 404 頁面。

總結

Ingress 是 Kubernetes 中不可或缺的組件,透過靈活的路由規則和負載平衡策略,它能夠高效地管理 Cluster 內部應用的外部存取。選擇合適的 Ingress Controller 並進行正確設定,是運營 Kubernetes Cluster 時的重要課題。在未來的課程中,我們將進一步探討 Kubernetes 中的命名空間和資源隔離技術,幫助你更好地組織和管理 Cluster 內部資源。


上一篇
Day 18- Job 與 CronJob 處理一次性和定期任務
下一篇
Day 20- Kubernetes 中的命名空間與資源隔離
系列文
Kubernetes三十天就上手30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言